package com.jyr.ohs.controller;

import com.jyr.ohs.common.PageQueryUtils;
import com.jyr.ohs.common.UnifiedJsonReturn;
import com.jyr.ohs.entity.*;
import com.jyr.ohs.service.AdminService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.List;

/**
 * @author ZhongJing </p>
 * @Description </p>
 * @date 2021/4/13 11:43 上午 </p>
 */
@Slf4j
@RestController
@RequestMapping(value = "/admin")
public class AdminController {

    @Autowired
    AdminService adminService;

    @GetMapping(value = "/shutdown")
    public ModelAndView exit(HttpSession session) {
        ModelAndView mav = new ModelAndView();

        session.removeAttribute("admin");

        mav.setViewName("common/all_login");

        return mav;
    }

    /**
     * 跳转到管理员主页
     */
    @GetMapping(value = "/main")
    public ModelAndView main() {
        ModelAndView mav = new ModelAndView();

        // 设置跳转视图
        mav.setViewName("admin/main");

        return mav;
    }

    /**
     * 跳转到管理员登陆页面
     */
    @GetMapping(value = "/toLogin")
    public ModelAndView toLogin() {
        ModelAndView mav = new ModelAndView();

        // 设置跳转视图
        mav.setViewName("admin/login");

        return mav;
    }

    /**
     * 跳转到管理员注册页面
     */
    @GetMapping(value = "/toRegist")
    public ModelAndView toRegist() {
        ModelAndView mav = new ModelAndView();

        // 设置跳转视图
        mav.setViewName("admin/regist");

        return mav;
    }

    /**
     * 管理员登陆
     *
     * @param username 用户名
     * @param password 密码
     * @param session  用于存储信息到session域中
     * @return 统一的JSON格式
     */
    @PostMapping(value = "/login")
    public UnifiedJsonReturn<Admin> login(@RequestParam String username,
                                          @RequestParam String password,
                                          HttpSession session) {
        // 调用service层方法，获取返回的值
        UnifiedJsonReturn<Admin> jsonReturn = adminService.login(username, password);

        // 取出admin信息
        Admin admin = jsonReturn.getData();

        // 将admin信息存储到session域中
        session.setAttribute("admin", admin);

        // 清空json中的admin信息，并返回
        return jsonReturn.data(null);
    }

    /**
     * 管理员注册
     *
     * @param username 用户名
     * @param password 密码
     * @return 返回统一的JSON格式
     */
    @PostMapping(value = "/regist")
    public UnifiedJsonReturn<Admin> regist(@RequestParam String username,
                                           @RequestParam String password) {

        // 调用service层方法，直接return返回的值
        return adminService.regist(username, password);
    }

    /**
     * 跳转到学生列表（带分页和模糊查询）
     *
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @param id       学生id如果没有则查询所有学生
     * @return 返回ModelAndView对象，添加数据并跳转视图
     */
    @GetMapping(value = "/toStudentList")
    public ModelAndView toStudentList(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                                      @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                                      @RequestParam(value = "id", defaultValue = "") String id) {
        // 创建视图模型
        ModelAndView mav = new ModelAndView();

        // 查询学生列表信息
        List<Student> students = adminService.getStudentListLikeId(id);

        // 分页
        PageQueryUtils<Student> pageQueryUtils = new PageQueryUtils<>(pageNum, pageSize, students);
        pageQueryUtils.page();

        // 记录日志
        log.info("student:" + students);

        // 将学生信息保存到request域
        mav.addObject("pageQueryUtils", pageQueryUtils);

        // 如果id不为空，让id回显
        if (!"".equals(id)) {
            mav.addObject("id", id);
        }

        // 设置跳转视图
        mav.setViewName("admin/student_list");

        // 返回视图模型
        return mav;
    }

    /**
     * 根据ID删除学生信息
     *
     * @param id 要删除学生的ID
     * @return 返回统一JSON格式
     */
    @DeleteMapping(value = "/deleteStudent")
    public UnifiedJsonReturn<Student> deleteStudent(String id) {
        return adminService.deleteStudentById(id);
    }

    /**
     * 跳转到修改学生信息页面
     *
     * @param id 要修改学生的id
     * @return 跳转视图
     */
    @GetMapping(value = "/toStudentEdit")
    public ModelAndView toStudentEdit(String id) {
        ModelAndView mav = new ModelAndView();

        List<Grade> grades = adminService.getAllGrade("");

        mav.addObject("grades", grades);

        Student student = adminService.getStudentById(id);

        if (student != null) {
            mav.addObject("student", student);
        }

        mav.setViewName("admin/student_edit");

        return mav;
    }

    /**
     * 修改学生信息
     *
     * @param student 修改后的学生信息
     * @return 返回统一JSON格式
     */
    @PutMapping(value = "/updateStudent")
    public UnifiedJsonReturn<Student> updateStudent(Student student) {
        return adminService.updateStudent(student);
    }

    @GetMapping(value = "/toAddStudent")
    public ModelAndView toAddStudent() {

        ModelAndView mav = new ModelAndView();

        // 获取所有班级信息
        List<Grade> grades = adminService.getAllGrade("");

        // 把班级信息放到request域
        mav.addObject("grades", grades);

        mav.setViewName("admin/student_add");

        return mav;
    }

    /**
     * 添加学生信息
     *
     * @param student 要添加的学生信息
     * @return 返回统一JSON格式
     */
    @PostMapping(value = "/addStudent")
    public UnifiedJsonReturn<Student> addStudent(Student student) {
        return adminService.addStudent(student);
    }

    /**
     * 跳转到教师列表
     *
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @param name     用户模糊查询的教师姓名
     * @return 返回视图模型，跳转到教师列表
     */
    @GetMapping(value = "/toTeacherList")
    public ModelAndView toTeacherList(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                                      @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                                      @RequestParam(value = "name", defaultValue = "") String name) {
        // 创建视图模型
        ModelAndView mav = new ModelAndView();

        // 查询所有教师
        List<Teacher> teachers = adminService.getTeacherListLikeName(name);

        // 分页
        PageQueryUtils<Teacher> pageQueryUtils = new PageQueryUtils<>(pageNum, pageSize, teachers);
        pageQueryUtils.page();

        // 将分页数据保存到request域
        mav.addObject("pageQueryUtils", pageQueryUtils);

        // 如果name不为空，让id回显
        if (!"".equals(name)) {
            mav.addObject("name", name);
        }

        // 设置跳转视图
        mav.setViewName("admin/teacher_list");

        // 返回视图模型
        return mav;
    }

    /**
     * 跳转到修改教师信息页面
     *
     * @param id 要修改教师的id
     * @return 返回视图模型，跳转页面
     */
    @GetMapping(value = "/toEditTeacher")
    public ModelAndView toEditTeacher(Integer id) {
        ModelAndView mav = new ModelAndView();

        // 查询对应id教师的信息
        Teacher teacher = adminService.getTeacherById(id);

        // 把教师信息放到request域
        mav.addObject("teacher", teacher);

        // 设置跳转视图
        mav.setViewName("admin/teacher_edit");

        return mav;
    }

    /**
     * 修改教师信息
     *
     * @param teacher 修改后的教师信息
     * @return 返回统一JSON格式
     */
    @PutMapping(value = "/editTeacher")
    public UnifiedJsonReturn<Teacher> editTeacher(Teacher teacher) {
        return adminService.updateTeacher(teacher);
    }

    /**
     * 跳转到添加教师页面
     *
     * @return 返回视图模型，跳转页面
     */
    @GetMapping(value = "/toAddTeacher")
    public ModelAndView toAddTeacher() {
        ModelAndView mav = new ModelAndView();

        mav.setViewName("admin/teacher_add");

        return mav;
    }

    /**
     * 添加教师
     *
     * @param teacher 要添加的教师信息
     * @return 返回统一JSON格式
     */
    @PostMapping(value = "/addTeacher")
    public UnifiedJsonReturn<Teacher> addTeacher(Teacher teacher) {
        return adminService.addTeacher(teacher);
    }

    /**
     * 根据id删除教师信息
     *
     * @param id 要删除的教师id
     * @return 返回统一JSON格式
     */
    @DeleteMapping(value = "/deleteTeacher")
    public UnifiedJsonReturn<Teacher> deleteTeacher(Integer id) {
        return adminService.deleteTeacher(id);
    }

    /**
     * 跳转到班级列表页面
     *
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @param name     模糊查询的名字
     * @return 返回视图模型，跳转页面
     */
    @GetMapping(value = "/toGradeList")
    public ModelAndView toGradeList(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                                    @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                                    @RequestParam(value = "name", defaultValue = "") String name) {

        ModelAndView mav = new ModelAndView();

        // 获取所有班级信息
        List<Grade> grades = adminService.getAllGrade(name);

        // 分页
        PageQueryUtils<Grade> pageQueryUtils = new PageQueryUtils<>(pageNum, pageSize, grades);
        pageQueryUtils.page();

        // 把班级信息和分页信息放到request域
        mav.addObject("pageQueryUtils", pageQueryUtils);

        // 如果name不为空，让id回显
        if (!"".equals(name)) {
            mav.addObject("name", name);
        }

        // 设置跳转视图
        mav.setViewName("admin/grade_list");

        return mav;

    }

    /**
     * 跳转到添加班级页面
     */
    @GetMapping(value = "/toAddGrade")
    public ModelAndView toAddGrade() {
        ModelAndView mav = new ModelAndView();

        mav.setViewName("admin/grade_add");

        return mav;
    }

    /**
     * 添加班级
     *
     * @param name 班级名称
     * @return 返回统一JSON格式
     */
    @PostMapping(value = "/addGrade")
    public UnifiedJsonReturn<Grade> addGrade(String name) {
        return adminService.addGrade(name);
    }

    /**
     * 删除班级信息
     *
     * @param id 要删除班级信息的id
     * @return 返回统一JSON格式
     */
    @DeleteMapping(value = "/deleteGrade")
    public UnifiedJsonReturn<Grade> deleteGrade(Integer id) {
        return adminService.deleteGrade(id);
    }

    /**
     * 跳转到修改班级信息页面
     *
     * @param id 要修改班级的id
     */
    @GetMapping(value = "/toEditGrade")
    public ModelAndView toEditGrade(Integer id) {
        ModelAndView mav = new ModelAndView();

        // 查询该id对应的班级信息
        Grade grade = adminService.getGradeById(id);

        // 如果查的到对象，就跳转
        if (grade != null) {
            // 把班级信息放到request域
            mav.addObject("grade", grade);

            // 设置跳转视图
            mav.setViewName("admin/grade_edit");
        } else {
            // 如果查不到，就到班级列表页面（如果没有并发，下面这个这辈子都不会执行的）
            mav.setViewName("redirect:/admin/toGradeList");
        }

        return mav;
    }

    /**
     * 修改班级信息
     */
    @PutMapping(value = "/editGrade")
    public UnifiedJsonReturn<Grade> editGrade(Grade grade) {
        return adminService.updateGrade(grade);
    }

    /**
     * 跳转到课程列表，带分页带模糊查询
     *
     * @param pageNum  当前页码
     * @param pageSize 每页显示条数
     * @param name     模糊查询的名字
     */
    @GetMapping(value = "/toCourseList")
    public ModelAndView toCourseList(@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
                                     @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                                     @RequestParam(value = "name", defaultValue = "") String name) {

        ModelAndView mav = new ModelAndView();

        // 获取课程信息
        List<Course> courses = adminService.getAllCourseLikeName(name);

        // 分页
        PageQueryUtils<Course> pageQueryUtils = new PageQueryUtils<>(pageNum, pageSize, courses);
        pageQueryUtils.page();

        // 将分页后的数据放到request域
        mav.addObject("pageQueryUtils", pageQueryUtils);

        // 如果name不为空，让name回显
        if (!"".equals(name)) {
            mav.addObject("name", name);
        }

        // 设置跳转视图
        mav.setViewName("admin/course_list");

        return mav;
    }

    /**
     * 跳转到编辑课程信息页面
     *
     * @param id 课程id
     */
    @GetMapping(value = "/toCourseEdit")
    public ModelAndView toCourseEdit(Integer id) {
        ModelAndView mav = new ModelAndView();

        // 根据id查询对应的课程信息
        Course course = adminService.getCourseById(id);

        // 查询所有教师信息
        List<Teacher> teachers = adminService.getTeacherListLikeName("");

        // 查询所有班级信息
        List<Grade> grades = adminService.getAllGrade("");

        // 将数据放到request域
        mav.addObject("course", course);
        mav.addObject("teachers", teachers);
        mav.addObject("grades", grades);

        // 设置跳转视图
        mav.setViewName("admin/course_edit");

        return mav;
    }

    /**
     * 修改课程信息
     *
     * @param course 修改后的课程信息
     * @return 返回统一JSON格式
     */
    @PutMapping(value = "/updateCourse")
    public UnifiedJsonReturn<Course> updateCourse(Course course) {
        return adminService.updateCourse(course);
    }

    /**
     * 跳转到添加课程页面
     */
    @GetMapping(value = "/toAddCourse")
    public ModelAndView toAddCourse() {
        ModelAndView mav = new ModelAndView();

        // 查询所有教师信息
        List<Teacher> teachers = adminService.getTeacherListLikeName("");

        // 查询所有班级信息
        List<Grade> grades = adminService.getAllGrade("");

        // 将数据放到request域
        mav.addObject("teachers", teachers);
        mav.addObject("grades", grades);

        // 设置跳转页面
        mav.setViewName("admin/course_add");

        return mav;
    }

    /**
     * 添加课程
     * @param course 课程信息
     * @return 返回统一JSON格式
     */
    @PostMapping(value = "/addCourse")
    public UnifiedJsonReturn<Course> addCourse(Course course) {
        return adminService.addCourse(course);
    }

    /**
     * 删除课程
     * @param id 要删除课程的id
     * @return 返回统一JSON格式
     */
    @DeleteMapping(value = "/deleteCourse")
    public UnifiedJsonReturn<Course> deleteCourse(Integer id) {
        return adminService.deleteCourse(id);
    }

}
